package apiserver

import (
	"time"

	"github.com/judwhite/go-svc/svc"
	"yingsheng.com/go-api-server/log"
)

type program struct {
	app *App
}

func (p *program) Init(env svc.Environment) error {
	if env.IsWindowsService() {
		//dir := filepath.Dir(os.Args[0])
		//return os.Chdir(dir)
	} else {
		//解除系统进程连接线限制
		//		var rlim syscall.Rlimit
		//		err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim)
		//		if err != nil {
		//			return errors.New("get rlimit error: " + err.Error())
		//		}
		//		rlim.Cur = 50000
		//		rlim.Max = 50000
		//		err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim)
		//		if err != nil {
		//			return errors.New("set rlimit error: " + err.Error())
		//		}
	}
	return nil
}

func (p *program) Start() error {
	p.app = ApiApp
	p.app.Run()

	return nil
}

func (p *program) Stop() error {
	log.Logger.Info("正在结束服务，请稍候。。。")
	if p.app != nil {
		p.app.Exit()
	}
	log.Logger.Info("服务已全部结束！")

	return nil
}

func Wait() {
	ApiApp.Wait()
}

// 启动服务
func Run() {
	if err := svc.Run(&program{}); err != nil {
		log.Logger.Critical(err)
	}
}

// 注册服务模块控制器
func AddController(controllerName string, c ControllerInterface) {
	ApiApp.Handlers.Add(controllerName, c)
}

// 注册RPC服务
func AddRpcService(s interface{}) {
	ApiApp.Rpc.AddMethods(s)
}

// 注册定时任务
func AddTask(tf TaskFunc) {
	f := func() time.Duration {
		defer ApiApp.RecoverPanic("task")
		return tf()
	}

	ApiApp.taskFunc = append(ApiApp.taskFunc, f)
}

// 注册过滤器
func AddFilter(ff FilterFunc) {
	ApiApp.filterFunc = append(ApiApp.filterFunc, ff)
}
